<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>面试题 | Oliver知识收集站</title>
    <meta name="generator" content="VuePress 1.9.7">
    
    <meta name="description" content="享受着互联网广泛知识，并加以记录，日积月累让它成为一个档案处！">
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
    
    <link rel="preload" href="/oliver-vuepress/assets/css/0.styles.4ea20d86.css" as="style"><link rel="preload" href="/oliver-vuepress/assets/js/app.c21e6ffc.js" as="script"><link rel="preload" href="/oliver-vuepress/assets/js/3.6dd9a2a1.js" as="script"><link rel="preload" href="/oliver-vuepress/assets/js/1.898920d0.js" as="script"><link rel="preload" href="/oliver-vuepress/assets/js/66.4ee90e29.js" as="script"><link rel="prefetch" href="/oliver-vuepress/assets/js/10.41b2bf91.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/11.a95c117d.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/12.8607f0e1.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/13.a52d6846.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/14.249b4e52.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/15.d458d12e.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/16.ba334206.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/17.1b91c9fa.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/18.e2ea2eb5.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/19.bf0e2553.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/20.268bd174.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/21.cd1bbed5.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/22.da4bc7f7.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/23.12f0c72f.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/24.b7886742.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/25.6e71af85.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/26.5c127243.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/27.e98fd8bf.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/28.ce83b09c.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/29.50398f0f.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/30.05e1339c.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/31.ef4b13fb.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/32.ba5f8351.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/33.3902db0a.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/34.36a05884.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/35.87215872.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/36.db360c58.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/37.402e5374.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/38.c9228dd8.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/39.72ba5d1f.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/4.7bb03d47.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/40.7e7949bf.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/41.c0d5b947.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/42.d9984467.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/43.e6a43668.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/44.10d7fe47.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/45.f692ec2d.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/46.9b920343.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/47.8e3d94f9.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/48.7d356e5b.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/49.b0df6271.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/5.1fa544da.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/50.805e1466.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/51.1b31d40e.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/52.44e69a41.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/53.da1def53.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/54.6569f7db.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/55.5fc3de47.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/56.da649377.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/57.6ff15ed4.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/58.a62f6424.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/59.f68ae517.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/6.f5bd8e9b.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/60.dda416bc.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/61.4e0c719f.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/62.8c5ef01e.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/63.7089eb8b.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/64.b5ec150d.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/65.6720cda4.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/67.cc4b0c6d.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/7.d5950c53.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/8.382fb3a5.js"><link rel="prefetch" href="/oliver-vuepress/assets/js/9.d593f4c1.js">
    <link rel="stylesheet" href="/oliver-vuepress/assets/css/0.styles.4ea20d86.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container" data-v-130b300a><div data-v-130b300a><div class="password-shadow password-wrapper-out" style="display:none;" data-v-25ba6db2 data-v-130b300a data-v-130b300a><h3 class="title" data-v-25ba6db2 data-v-25ba6db2>Oliver知识收集站</h3> <p class="description" data-v-25ba6db2 data-v-25ba6db2>享受着互联网广泛知识，并加以记录，日积月累让它成为一个档案处！</p> <label id="box" class="inputBox" data-v-25ba6db2 data-v-25ba6db2><input type="password" value="" data-v-25ba6db2> <span data-v-25ba6db2>Konck! Knock!</span> <button data-v-25ba6db2>OK</button></label> <div class="footer" data-v-25ba6db2 data-v-25ba6db2><span data-v-25ba6db2><i class="iconfont reco-theme" data-v-25ba6db2></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-25ba6db2>vuePress-theme-reco</a></span> <span data-v-25ba6db2><i class="iconfont reco-copyright" data-v-25ba6db2></i> <a data-v-25ba6db2><span data-v-25ba6db2>oliver.shi</span>
            
          <!---->
          2022
        </a></span></div></div> <div class="hide" data-v-130b300a><header class="navbar" data-v-130b300a><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/oliver-vuepress/" class="home-link router-link-active"><!----> <span class="site-name">Oliver知识收集站</span></a> <div class="links"><div class="color-picker"><a class="color-button"><i class="iconfont reco-color"></i></a> <div class="color-picker-menu" style="display:none;"><div class="mode-options"><h4 class="title">Choose mode</h4> <ul class="color-mode-options"><li class="dark">dark</li><li class="auto active">auto</li><li class="light">light</li></ul></div></div></div> <div class="search-box"><i class="iconfont reco-search"></i> <input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/oliver-vuepress/" class="nav-link"><i class="undefined"></i>
  主页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
      Java
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/basics/" class="nav-link"><i class="undefined"></i>
  基础
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/concurrent/" class="nav-link"><i class="undefined"></i>
  并发
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/jvm/jvm.html" class="nav-link"><i class="undefined"></i>
  JVM
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/other/" class="nav-link"><i class="undefined"></i>
  杂
</a></li></ul></div></div><div class="nav-item"><a href="/oliver-vuepress/articles/spring/first.html" class="nav-link"><i class="undefined"></i>
  Spring
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
      中间件
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/middleware/redis/redis.html" class="nav-link"><i class="undefined"></i>
  Redis
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/middleware/kafka/framework.html" class="nav-link"><i class="undefined"></i>
  Kafka
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/middleware/zookeeper.html" class="nav-link"><i class="undefined"></i>
  Zookeeper
</a></li></ul></div></div><div class="nav-item"><a href="/oliver-vuepress/articles/algorithm/" class="nav-link"><i class="undefined"></i>
  算法
</a></div><div class="nav-item"><a href="/oliver-vuepress/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
  TimeLine
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
      收集站
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/article/first.html" class="nav-link"><i class="undefined"></i>
  技术好文
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/book/first.html" class="nav-link"><i class="undefined"></i>
  书籍
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/assembly/first.html" class="nav-link"><i class="undefined"></i>
  优秀开发组件
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/software/first.html" class="nav-link"><i class="undefined"></i>
  软件
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/plugin/first.html" class="nav-link"><i class="undefined"></i>
  插件
</a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask" data-v-130b300a></div> <aside class="sidebar" data-v-130b300a><div class="personal-info-wrapper" data-v-39576ba9 data-v-130b300a><!----> <h3 class="name" data-v-39576ba9>
    oliver.shi
  </h3> <div class="num" data-v-39576ba9><div data-v-39576ba9><h3 data-v-39576ba9>52</h3> <h6 data-v-39576ba9>Articles</h6></div> <div data-v-39576ba9><h3 data-v-39576ba9>6</h3> <h6 data-v-39576ba9>Tags</h6></div></div> <ul class="social-links" data-v-39576ba9></ul> <hr data-v-39576ba9></div> <nav class="nav-links"><div class="nav-item"><a href="/oliver-vuepress/" class="nav-link"><i class="undefined"></i>
  主页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
      Java
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/basics/" class="nav-link"><i class="undefined"></i>
  基础
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/concurrent/" class="nav-link"><i class="undefined"></i>
  并发
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/jvm/jvm.html" class="nav-link"><i class="undefined"></i>
  JVM
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/java/other/" class="nav-link"><i class="undefined"></i>
  杂
</a></li></ul></div></div><div class="nav-item"><a href="/oliver-vuepress/articles/spring/first.html" class="nav-link"><i class="undefined"></i>
  Spring
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
      中间件
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/middleware/redis/redis.html" class="nav-link"><i class="undefined"></i>
  Redis
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/middleware/kafka/framework.html" class="nav-link"><i class="undefined"></i>
  Kafka
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/middleware/zookeeper.html" class="nav-link"><i class="undefined"></i>
  Zookeeper
</a></li></ul></div></div><div class="nav-item"><a href="/oliver-vuepress/articles/algorithm/" class="nav-link"><i class="undefined"></i>
  算法
</a></div><div class="nav-item"><a href="/oliver-vuepress/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
  TimeLine
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="undefined"></i>
      收集站
    </span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/article/first.html" class="nav-link"><i class="undefined"></i>
  技术好文
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/book/first.html" class="nav-link"><i class="undefined"></i>
  书籍
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/assembly/first.html" class="nav-link"><i class="undefined"></i>
  优秀开发组件
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/software/first.html" class="nav-link"><i class="undefined"></i>
  软件
</a></li><li class="dropdown-item"><!----> <a href="/oliver-vuepress/articles/collect/plugin/first.html" class="nav-link"><i class="undefined"></i>
  插件
</a></li></ul></div></div> <!----></nav> <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>面试题</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/oliver-vuepress/articles/question/first.html" aria-current="page" class="active sidebar-link">面试题</a></li></ul></section></li></ul> </aside> <div class="password-shadow password-wrapper-in" style="display:none;" data-v-25ba6db2 data-v-130b300a><h3 class="title" data-v-25ba6db2 data-v-25ba6db2></h3> <!----> <label id="box" class="inputBox" data-v-25ba6db2 data-v-25ba6db2><input type="password" value="" data-v-25ba6db2> <span data-v-25ba6db2>Konck! Knock!</span> <button data-v-25ba6db2>OK</button></label> <div class="footer" data-v-25ba6db2 data-v-25ba6db2><span data-v-25ba6db2><i class="iconfont reco-theme" data-v-25ba6db2></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-25ba6db2>vuePress-theme-reco</a></span> <span data-v-25ba6db2><i class="iconfont reco-copyright" data-v-25ba6db2></i> <a data-v-25ba6db2><span data-v-25ba6db2>oliver.shi</span>
            
          <!---->
          2022
        </a></span></div></div> <div data-v-130b300a><main class="page"><section><div class="page-title"><h1 class="title">面试题</h1> <div data-v-f875f3fc><i class="iconfont reco-account" data-v-f875f3fc><span data-v-f875f3fc>oliver.shi</span></i> <!----> <!----> <!----></div></div> <div class="theme-reco-content content__default"><h1 id="面试题"><a href="#面试题" class="header-anchor">#</a> 面试题</h1> <h2 id="请说说mybatis的工作原理"><a href="#请说说mybatis的工作原理" class="header-anchor">#</a> 请说说MyBatis的工作原理？</h2> <ol><li>读取 MyBatis 配置文件：mybatis-config.xml 为 MyBatis 的全局配置文件，配置了 MyBatis 的运行环境等信息，例如数据库连接信息。</li> <li>加载映射文件。映射文件即 SQL 映射文件，该文件中配置了操作数据库的 SQL 语句，需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件，每个文件对应数据库中的一张表。</li> <li>构造会话工厂：通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。</li> <li>创建会话对象：由会话工厂创建 SqlSession 对象，该对象中包含了执行 SQL 语句的所有方法。</li> <li>Executor 执行器：MyBatis 底层定义了一个 Executor 接口来操作数据库，它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句，同时负责查询缓存的维护。</li> <li>MappedStatement 对象：在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数，该参数是对映射信息的封装，用于存储要映射的 SQL 语句的 id、参数等信息。</li> <li>输入参数映射：输入参数类型可以是 Map、List 等集合类型，也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。</li> <li>出结果映射：输出结果类型可以是 Map、 List 等集合类型，也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。</li></ol> <h2 id="hashmap存储原理-有啥问题-如何避免"><a href="#hashmap存储原理-有啥问题-如何避免" class="header-anchor">#</a> HashMap存储原理，有啥问题，如何避免？</h2> <ul><li>存储原理：
<ul><li>HashMap是一个键值对的集合，是非synchronized的，源码中每个节点用Node <code>&lt;K,V&gt;</code> 表示。 Node是一个内部类，这里的key为键，value为值，next指向下一个元素，可以看出HashMap中的元素不是一个单纯的键值对，还包含下一个元素的引用</li> <li>HashMap的数据结构：数组+(链表或红黑树)，数组是HashMap的主体，链表则是主要为了解决哈希冲突而存在的。 在HashMap底层使用数组加（链表或红黑树）的结构完美的解决了数组和链表的问题，使得查询和插入，删除的效率都很高。因为链表中元素太多的时候会影响查找效率，所以当链表的元素个数达到8的时候使用链表存储就转变成了使用红黑树存储，原因就是红黑树是平衡二叉树，在查找性能方面比链表要高。</li> <li>HashMap中有两个重要的参数：初始容量大小和加载因子，初始容量大小是创建时给数组分配的容量大小，默认值为16，用数组容量大小乘以加载因子得到一个值。一旦数组中存储的元素个数超过该值就会调用rehash方法将数组容量增加到原来的两倍，专业术语叫做扩容。 在做扩容的时候会生成一个新的数组，原来的所有数据需要重新计算哈希码值重新分配到新的数组，所以扩容的操作非常消耗性能。</li></ul></li> <li>问题：
<ul><li>当重新调整HashMap大小的时候，存在条件竞争，如果两个线程都发现HashMap需要重新调整大小了，它们会同时试着调整大小。在调整大小的过程中，存储在LinkedList中的元素的次序会反过来，因为移动到新的bucket位置的时候，HashMap并不会将元素放在LinkedList的尾部，而是放在头部，这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了，那么就死循环了。</li></ul></li> <li>避免方式
<ul><li>添加了红黑树，当链表长度大于8时，还需要判断当前数组的长度,如果数组长度 &lt; 64 时，此时并不会转换为红黑树，而是扩容, 只有当链表 中的元素个数 &gt; 8，并且数组的长度 &gt;= 64 时才会将链表转为红黑树。 扩容后，新数组中的链表顺序依然与旧数组中的链表顺序保持一致。具体JDK8是用 head 和 tail 来保证链表的顺序和之前一样，这样就不会产生循环引用，也就没有死循环了。 虽然修复了死循环的BUG，但是HashMap 还是非线程安全类，仍然会产生数据丢失等问题。</li> <li>可以使用HashTable和调用Collections工具类的synchronizedMap()方法达到线程安全的目的。但由于synchronized是串行执行，在访问量很大的情况下效率很低，不推荐使用</li></ul></li></ul> <h2 id="通常一个xml映射文件-都会写一个dao接口与之对应-请问-这个dao接口的工作原理是什么-dao接口里的方法-参数不同时-方法能重载吗"><a href="#通常一个xml映射文件-都会写一个dao接口与之对应-请问-这个dao接口的工作原理是什么-dao接口里的方法-参数不同时-方法能重载吗" class="header-anchor">#</a> 通常一个Xml映射文件，都会写一个Dao接口与之对应，请问，这个Dao接口的工作原理是什么？Dao接口里的方法，参数不同时，方法能重载吗？</h2> <ul><li>Dao接口，就是人们常说的Mapper接口，接口的全限名，就是映射文件中的namespace的值，接口的方法名，就是映射文件中MappedStatement的id值，接口方法内的参数，就是传递给sql的参数。</li> <li>Mapper接口是没有实现类的，当调用接口方法时，接口全限名+方法名拼接字符串作为key值，可唯一定位一个MappedStatement，举例：com.mybatis3.mappers.StudentDao.findStudentById，可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中，每一个 <code>&lt;select&gt;</code>、<code>&lt;insert&gt;</code>、<code>&lt;update&gt;</code>、<code>&lt;delete&gt;</code>标签，都会被解析为一个MappedStatement对象。</li> <li>Dao接口里的方法，是不能重载的，因为是全限名+方法名的保存和寻找策略。</li> <li>Dao接口的工作原理是JDK动态代理，Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象（如使用spring会注入到容器中），代理对象proxy会拦截接口方法，转而执行MappedStatement所代表的sql，然后将sql执行结果返回。</li></ul> <h2 id="jvm中类加载的过程-什么是双亲委派-类加载器有哪些"><a href="#jvm中类加载的过程-什么是双亲委派-类加载器有哪些" class="header-anchor">#</a> JVM中类加载的过程? 什么是双亲委派？ 类加载器有哪些?</h2> <ul><li>在加载阶段，虚拟机需要完成以下三件事情：
<ul><li>通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class文件中获取，可以从其他渠道，如：网络、动态生成、数据库等)；</li> <li>将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构；</li> <li>在内存中(对于HotSpot虚拟机而言就是方法区)生成一个代表这个类的java.lang.Class对象，作为方法区这个类的各种数据访问入口</li></ul></li> <li>双亲委派:
<ul><li>类加载器收到类加载请求，自己不加载，向上委托给父类加载，父类加载不了，再自己加载, 就是避免Java核心API篡改。</li></ul></li> <li>类加载器有哪些:
<ul><li>Bootstrap ClassLoader启动类 | 根加载器）::它用来加载 Java 的核心类，是用原生代码来实现的，并不继承自 java.lang.ClassLoader（负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class，由C++实现，不是ClassLoader子类）。由于引导类加载器涉及到虚拟机本地实现细节，开发者无法直接获取到启动类加载器的引用，所以不允许直接通过引用进行操作。--</li> <li>ExtClassLoader(扩展类加载器)：它负责加载JRE的扩展目录，lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现，开发者可以直接使用扩展类加载器。</li> <li>AppClassLoader:被称为系统（也称为应用）类加载器，它负责在JVM启动时加载来自Java命令的-classpath选项、java.class.path系统属性，或者CLASSPATH换将变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()来获取系统类加载器。如果没有特别指定，则用户自定义的类加载器都以此类加载器作为父加载器。由Java语言实现，父类加载器为ExtClassLoader。</li></ul></li></ul> <h2 id="component和-bean的区别是什么"><a href="#component和-bean的区别是什么" class="header-anchor">#</a> @Component和@Bean的区别是什么</h2> <blockquote><p>作用对象不同。</p></blockquote> <ul><li><p>@Component注解作用于类，而@Bean注解作用于方法。</p></li> <li><p>@Component注解通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中（我们可以使用@ComponentScan注解定义要扫描的路径）。</p></li> <li><p>@Bean注解通常是在标有该注解的方法中定义产生这个bean，告诉Spring这是某个类的实例，当我需要用它的时候还给我。</p></li> <li><p>@Bean注解比@Component注解的自定义性更强，而且很多地方只能通过@Bean注解来注册bean。</p></li></ul> <h2 id="filesystemresource和classpathresource之间的区别是什么"><a href="#filesystemresource和classpathresource之间的区别是什么" class="header-anchor">#</a> FileSystemResource和ClassPathResource之间的区别是什么？</h2> <ul><li><p>在FileSystemResource中你需要给出spring-config.xml(Spring配置)文件相对于您的项目的相对路径或文件的绝对位置。</p></li> <li><p>在ClassPathResource中Sping查找文件使用ClassPath，因此spring-config.xml应该包含在类路径下。</p></li> <li><p>一句话,ClassPathResource在类路径下搜索和FileSystemResource在文件系统下搜索。</p></li></ul> <h2 id="构造方法注入和setter注入之间的区别"><a href="#构造方法注入和setter注入之间的区别" class="header-anchor">#</a> 构造方法注入和setter注入之间的区别</h2> <ol><li>在Setter注入,可以将依赖项部分注入,构造方法注入不能部分注入，因为调用构造方法如果传入所有的参数就会报错。</li> <li>如果我们为同一属性提供Setter和构造方法注入，Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。显然，构造方法注入被称为创建实例的第一选项。</li> <li>使用setter注入你不能保证所有的依赖都被注入,这意味着你可以有一个对象依赖没有被注入。在另一方面构造方法注入直到你所有的依赖都注入后才开始创建实例。</li> <li>在构造函数注入,如果A和B对象相互依赖：A依赖于B,B也依赖于A,此时在创建对象的A或者B时，Spring抛出ObjectCurrentlyInCreationException。所以Spring可以通过setter注入,从而解决循环依赖的问题。</li></ol> <h2 id="applicationcontext通常的实现是什么"><a href="#applicationcontext通常的实现是什么" class="header-anchor">#</a> ApplicationContext通常的实现是什么?</h2> <ul><li>FileSystemXmlApplicationContext ：此容器从一个XML文件中加载beans的定义，XML Bean 配置文件的全路径名必须提供给它的构造函数。</li> <li>ClassPathXmlApplicationContext：此容器也从一个XML文件中加载beans的定义，这里，你需要正确设置classpath因为这个容器将在classpath里找bean配置。</li> <li>WebXmlApplicationContext：此容器加载一个XML文件，此文件定义了一个WEB应用的所有bean。</li></ul> <h2 id="spring自动装配有哪些方式"><a href="#spring自动装配有哪些方式" class="header-anchor">#</a> spring自动装配有哪些方式？</h2> <ul><li>自动装配的不同模式：
<ul><li>no - 这是默认设置，表示没有自动装配。应使用显式 bean 引用进行装配。</li> <li>byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。</li> <li>byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配，则匹配并装配属性。</li> <li>构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。</li> <li>autodetect - 首先容器尝试通过构造函数使用 autowire 装配，如果不能，则尝试通过 byType 自动装配。</li></ul></li></ul> <h2 id="spring-支持几中-bean-scope"><a href="#spring-支持几中-bean-scope" class="header-anchor">#</a> spring 支持几中 bean scope?</h2> <ul><li>Spring bean 支持 5 种 scope：
<ul><li>Singleton - 每个 Spring IoC 容器仅有一个单实例。</li> <li>Prototype - 每次请求都会产生一个新的实例。</li> <li>Request - 每一次 HTTP 请求都会产生一个新的实例，并且该 bean 仅在当前 HTTP 请求内有效。</li> <li>Session - 每一次 HTTP 请求都会产生一个新的 bean，同时该 bean 仅在当前 HTTP session 内有效。</li> <li>Global-session - 类似于标准的 HTTP Session 作用域，不过它仅仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念，它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean，那么 web 会自动当成 session 类型来使用。</li></ul></li></ul> <blockquote><p>仅当用户使用支持 Web 的 ApplicationContext 时，最后三个才可用。</p></blockquote> <ul><li>Spring 中支持定义Bean的Scope种类有以下6种：
<ul><li>Singletone: 每个Spring容器中唯一（单例子，默认容器初始化时预创建）</li> <li>Prototype： 每次向容器请求bean对象时，创建一个新的实例；</li> <li>Request： 只针对Web应用有效： 每次Http请求，创建一个Bean的实例；</li> <li>Session： 只在Web应用中有效，每个Session会话过程中有效，</li> <li>Application：只Web应用有效，整个Web应用中唯一；</li> <li>websocket： 只Web应用有效，WebSocket声明周期内唯一； --&gt;</li></ul></li></ul> <h2 id="描述spring和springmvc父子容器关系-父子容器重复扫描会出现什么样的问题-子容器是否可以使用父容器中的bean-如果可以如何配置"><a href="#描述spring和springmvc父子容器关系-父子容器重复扫描会出现什么样的问题-子容器是否可以使用父容器中的bean-如果可以如何配置" class="header-anchor">#</a> 描述Spring和SpringMVC父子容器关系, 父子容器重复扫描会出现什么样的问题, 子容器是否可以使用父容器中的bean, 如果可以如何配置?</h2> <ol><li><p>Spring和SpringMVC父子容器关系？</p> <ol><li>Spring是父容器，SpringMVC是其子容器，并且在Spring父容器中注册的Bean对于SpringMVC容器中是可见的，而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的，也就是子容器可以看见父容器中的注册的Bean，反之就不行。</li></ol></li> <li><p>父子容器重复扫描会出现什么样的问题？</p> <ol><li>父容器是使用了ContextLoaderListener加载并实例化的ioc容器为父容器</li> <li>子容器是使用了DispatcherServerlet加载并实例化的ioc容器为子容器</li> <li>父容器不能调用子容器中任何的组件,子容器可以调用除了controller以外的组件.</li></ol></li> <li><p>子容器是否可以使用父容器中的bean, 如果可以如何配置?</p> <ol><li>可以</li></ol> <div class="language-xml extra-class"><pre class="language-xml"><code> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>bean</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>detectHandlerMethodsInAncestorContexts<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>value</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>value</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>property</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>bean</span><span class="token punctuation">&gt;</span></span>
</code></pre></div></li></ol> <h2 id="简述-什么是死锁-活锁-饥饿-以及产生的原因"><a href="#简述-什么是死锁-活锁-饥饿-以及产生的原因" class="header-anchor">#</a> 简述 什么是死锁, 活锁, 饥饿 以及产生的原因？</h2> <ul><li>死锁: 指两个或两个以上的进程(或线程)在执行过程中, 因争夺资源造成的一种相互等待的现象, 若无外力作用, 他们将无法推进下去产生死锁的原因?
<ul><li>互斥条件: 所谓互斥就是进程在某一时间内独占资源.</li> <li>请求与保持条件: 一个进程因请求资源而阻塞时, 对已获得的资源保持不放</li> <li>不剥夺条件: 进程已获得资源, 在未使用前, 不能强行剥夺.</li> <li>循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系.</li></ul></li> <li>活锁:
<ul><li>任务或者执行者没有被阻塞, 由于某些条件没有满足, 导致一直重复尝试, 失败, 尝试, 失败.</li> <li>活锁和思索的区别在于, 处于活锁的实体是在不断的改变状态, 所谓的&quot;活&quot;, 而处于死锁的实体表现为等待, 活锁有可能自行解开,死锁则不能</li></ul></li> <li>饥饿: 一个或多个线程因为种种原因无法获得所需要的资源, 导致一直无法执行的状态</li> <li>java中导致饥饿的原因?
<ul><li>高优先级线程吞噬所有的低优先级线程cpu时间</li> <li>.线程被永久堵塞在一个等待进入同步块的状态, 因为其他线程总是能在它之前持续的对该同步块进行访问</li> <li>线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法), 因为其他线程总是被持续的获得唤醒</li></ul></li></ul> <h2 id="springmvc中的拦截器和servlet中的filter有什么区别"><a href="#springmvc中的拦截器和servlet中的filter有什么区别" class="header-anchor">#</a> SpringMVC中的拦截器和Servlet中的filter有什么区别?</h2> <ul><li>首先最核心的一点他们的拦截侧重点是不同的，SpringMVC中的拦截器是依赖JDK的反射实现的，SpringMVC的拦截器主要是进行拦截请求，通过对Handler进行处理的时候进行拦截，先声明的拦截器中的preHandle方法会先执行，然而它的postHandle方法（他是介于处理完业务之后和返回结果之前）和afterCompletion方法却会后执行。并且Spring的拦截器是按照配置的先后顺序进行拦截的。</li> <li>Servlet的filter是基于函数回调实现的过滤器，Filter主要是针对URL地址做一个编码的事情、而过滤掉没用的参数、安全校验（比较泛的，比如登录不登录之类</li></ul> <h2 id="讲一下-oom-以及遇到这种情况怎么处理的-是否使用过日志分析工具"><a href="#讲一下-oom-以及遇到这种情况怎么处理的-是否使用过日志分析工具" class="header-anchor">#</a> 讲一下 oom 以及遇到这种情况怎么处理的，是否使用过日志分析工具 ?</h2> <p>OOM，全称“OutOfMemory”，翻译成中文就是“内存用完了”，当 JVM 因为没有足够的 内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时，就会抛出这个 error。 处理过程：首先通过内存映射分析工具 如 EclipseMemoryAnalyzer 堆 dump 出的异常 堆转储进行快照解析确认内存中的对象是否是必要的， 也就是先分清楚是 内存泄漏 MemoryLeak 还是 MemoryOverflow 如果是内存泄漏 可 通过工具进一步查看泄露的对象到 GCRoots 的引用链， 就能找到泄露对象是怎么通过路径与 GCRoots 相关联导致垃圾收集器无法回收他们如果不存在泄露 就检查堆参数 -Xmx 与 -Xms 与机器物理 内存对比是否还可以调大 从代码上检测 是否是某些对象的生命周期过长持有状态时间 过长 尝试减少代码运行期间的内存消耗</p> <h2 id="spring-boot-中-约定优于配置-的具体产品体现在哪里。"><a href="#spring-boot-中-约定优于配置-的具体产品体现在哪里。" class="header-anchor">#</a> Spring Boot 中 “约定优于配置“的具体产品体现在哪里。</h2> <ul><li>Spring Boot Starter、Spring Boot Jpa 都是“约定优于配置“的一种体现。都是通过“约定优于配置“的设计思路来设计的，Spring Boot Starter 在启动的过程中会根据约定的信息对资源进行初始化；Spring Boot Jpa 通过约定的方式来自动生成 Sql ，避免大量无效代码编写。</li></ul> <h2 id="spring-boot-中如何实现定时任务"><a href="#spring-boot-中如何实现定时任务" class="header-anchor">#</a> Spring Boot 中如何实现定时任务 ?</h2> <blockquote><p>定时任务也是一个常见的需求，Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。</p></blockquote> <ul><li>在 Spring Boot 中使用定时任务主要有两种不同的方式，一个就是使用 Spring 中的 @Scheduled 注解，另一个则是使用第三方框架 Quartz。
<ul><li>使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。</li> <li>使用 Quartz ，则按照 Quartz 的方式，定义 Job 和 Trigger 即可。</li></ul></li></ul> <h2 id="wait-和-sleep-的区别"><a href="#wait-和-sleep-的区别" class="header-anchor">#</a> wait 和 sleep 的区别</h2> <ul><li>sleep 来自 Thread 类，和 wait 来自 Object 类。</li> <li>主要是sleep方法没有释放锁，而wait方法释放了 锁，使得其他线程可以使用同步控制块或者方法。</li> <li>wait，notify和 notifyAll 只能在同步控制方法或者同步控制块里面使用，而 sleep 可以在任何地方使用(使 用范围)</li> <li>sleep 必须捕获异常，而 wait ， notify 和 notifyAll 不需要捕获异常
<ul><li>sleep 方法属于 Thread 类中方法，表示让一个线程进入睡眠状态，等待一定的时间之后，自动醒来进入到可 运行状态，不会马上进入运行状态，因为线程调度机制恢复线程的运行也需要时间，一个线程对象调用了 sleep 方法之后，并不会释放他所持有的所有对象锁，所以也就不会影响其他进程对象的运行。但在 sleep 的过程中过 程中有可能被其他对象调用它的 interrupt() ,产生 InterruptedException 异常，如果你的程序不捕获这个异 常，线程就会异常终止，进入 TERMINATED 状态，如果你的程序捕获了这个异常，那么程序就会继续执行catch语 句块(可能还有 finally 语句块)以及以后的代码。</li> <li>注意 sleep() 方法是一个静态方法，也就是说他只对当前对象有效，通过 t.sleep() 让t对象进入 sleep ，这样 的做法是错误的，它只会是使当前线程被 sleep 而不是 t 线程</li> <li>wait 属于 Object 的成员方法，一旦一个对象调用了wait方法，必须要采用 notify() 和 notifyAll() 方法 唤醒该进程;如果线程拥有某个或某些对象的同步锁，那么在调用了 wait() 后，这个线程就会释放它持有的所有 同步资源，而不限于这个被调用了 wait() 方法的对象。 wait() 方法也同样会在 wait 的过程中有可能被其他对 象调用 interrupt() 方法而产生 。</li></ul></li></ul> <h2 id="spring-boot-starter-parent-有什么用"><a href="#spring-boot-starter-parent-有什么用" class="header-anchor">#</a> spring-boot-starter-parent 有什么用 ?</h2> <ol><li>定义了 Java 编译版本为 1.8</li> <li>使用 UTF-8 格式编码。</li> <li>继承自 spring-boot-dependencies，这个里边定义了依赖的版本，也正是因为继承了这个依赖，所以我们在写依赖时才不需要写版本号。</li> <li>执行打包操作的配置。</li> <li>自动化的资源过滤。</li> <li>自动化的插件配置。</li> <li>针对 application.properties 和 application.yml 的资源过滤，包括通过 profile 定义的不同环境的配置文件，例如 application-dev.properties 和 application-dev.yml。</li></ol> <h2 id="spring-boot-是否可以使用-xml-配置"><a href="#spring-boot-是否可以使用-xml-配置" class="header-anchor">#</a> Spring Boot 是否可以使用 XML 配置 ?</h2> <p>Spring Boot 推荐使用 Java 配置而非 XML 配置，但是 Spring Boot 中也可以使用 XML 配置，通过 @ImportResource 注解可以引入一个 XML 配置。</p> <h2 id="spring-boot-打成的-jar-和普通的-jar-有什么区别"><a href="#spring-boot-打成的-jar-和普通的-jar-有什么区别" class="header-anchor">#</a> Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?</h2> <ul><li>Spring Boot 项目最终打包成的 jar 是可执行 jar ，这种 jar 可以直接通过 java -jar xxx.jar 命令来运行，这种 jar 不可以作为普通的 jar 被其他项目依赖，即使依赖了也无法使用其中的类。</li> <li>Spring Boot 的 jar 无法被其他项目依赖，主要还是他和普通 jar 的结构不同。普通的 jar 包，解压后直接就是包名，包里就是我们的代码，而 Spring Boot 打包成的可执行 jar 解压后，在 \BOOT-INF\classes 目录下才是我们的代码，因此无法被直接引用。如果非要引用，可以在 pom.xml 文件中增加配置，将 Spring Boot 项目打包成两个 jar ，一个可执行，一个可引用。</li></ul> <blockquote><p>2020-09-08</p></blockquote> <h2 id="nginx是如何实现高并发的"><a href="#nginx是如何实现高并发的" class="header-anchor">#</a> Nginx是如何实现高并发的？</h2> <p>一个主进程，多个工作进程，每个工作进程可以处理多个请求，每进来一个request，会有一个worker进程去处理。但不是全程的处理，处理到可能发生阻塞的地方，比如向上游（后端）服务器转发request，并等待请求返回。那么，这个处理的worker继续处理其他请求，而一旦上游服务器返回了，就会触发这个事件，worker才会来接手，这个request才会接着往下走。</p> <p>由于web server的工作性质决定了每个request的大部份生命都是在网络传输中，实际上花费在server机器上的时间片不多。</p> <p>这是几个进程就解决高并发的秘密所在。即@skoo所说的webserver刚好属于网络io密集型应用，不算是计算密集型。</p> <h2 id="tomcat-servlet容器处理流程"><a href="#tomcat-servlet容器处理流程" class="header-anchor">#</a> Tomcat Servlet容器处理流程</h2> <p>当⽤户请求某个URL资源时</p> <ol><li>HTTP服务器会把请求信息使⽤ServletRequest对象封装起来</li> <li>进⼀步去调⽤Servlet容器中某个具体的Servlet</li> <li>在 2 中，Servlet容器拿到请求后，根据URL和Servlet的映射关系，找到相应的Servlet</li> <li>如果Servlet还没有被加载，就⽤反射机制创建这个Servlet，并调⽤Servlet的init⽅法来完成初始化</li> <li>接着调⽤这个具体Servlet的service⽅法来处理请求，请求处理结果使⽤ServletResponse对象封装</li> <li>把ServletResponse对象返回给HTTP服务器，HTTP服务器会把响应发送给客户端</li></ol></div></section> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新: </span> <span class="time">4/21/2022, 8:17:59 AM</span></div></footer> <!----> <div class="comments-wrapper"><!----></div> <ul class="side-bar sub-sidebar-wrapper" style="width:12rem;" data-v-cb1513f6><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#请说说mybatis的工作原理" class="sidebar-link reco-side-请说说mybatis的工作原理" data-v-cb1513f6>请说说MyBatis的工作原理？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#hashmap存储原理-有啥问题-如何避免" class="sidebar-link reco-side-hashmap存储原理-有啥问题-如何避免" data-v-cb1513f6>HashMap存储原理，有啥问题，如何避免？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#通常一个xml映射文件-都会写一个dao接口与之对应-请问-这个dao接口的工作原理是什么-dao接口里的方法-参数不同时-方法能重载吗" class="sidebar-link reco-side-通常一个xml映射文件-都会写一个dao接口与之对应-请问-这个dao接口的工作原理是什么-dao接口里的方法-参数不同时-方法能重载吗" data-v-cb1513f6>通常一个Xml映射文件，都会写一个Dao接口与之对应，请问，这个Dao接口的工作原理是什么？Dao接口里的方法，参数不同时，方法能重载吗？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#jvm中类加载的过程-什么是双亲委派-类加载器有哪些" class="sidebar-link reco-side-jvm中类加载的过程-什么是双亲委派-类加载器有哪些" data-v-cb1513f6>JVM中类加载的过程? 什么是双亲委派？ 类加载器有哪些?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#component和-bean的区别是什么" class="sidebar-link reco-side-component和-bean的区别是什么" data-v-cb1513f6>@Component和@Bean的区别是什么</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#filesystemresource和classpathresource之间的区别是什么" class="sidebar-link reco-side-filesystemresource和classpathresource之间的区别是什么" data-v-cb1513f6>FileSystemResource和ClassPathResource之间的区别是什么？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#构造方法注入和setter注入之间的区别" class="sidebar-link reco-side-构造方法注入和setter注入之间的区别" data-v-cb1513f6>构造方法注入和setter注入之间的区别</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#applicationcontext通常的实现是什么" class="sidebar-link reco-side-applicationcontext通常的实现是什么" data-v-cb1513f6>ApplicationContext通常的实现是什么?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring自动装配有哪些方式" class="sidebar-link reco-side-spring自动装配有哪些方式" data-v-cb1513f6>spring自动装配有哪些方式？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring-支持几中-bean-scope" class="sidebar-link reco-side-spring-支持几中-bean-scope" data-v-cb1513f6>spring 支持几中 bean scope?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#描述spring和springmvc父子容器关系-父子容器重复扫描会出现什么样的问题-子容器是否可以使用父容器中的bean-如果可以如何配置" class="sidebar-link reco-side-描述spring和springmvc父子容器关系-父子容器重复扫描会出现什么样的问题-子容器是否可以使用父容器中的bean-如果可以如何配置" data-v-cb1513f6>描述Spring和SpringMVC父子容器关系, 父子容器重复扫描会出现什么样的问题, 子容器是否可以使用父容器中的bean, 如果可以如何配置?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#简述-什么是死锁-活锁-饥饿-以及产生的原因" class="sidebar-link reco-side-简述-什么是死锁-活锁-饥饿-以及产生的原因" data-v-cb1513f6>简述 什么是死锁, 活锁, 饥饿 以及产生的原因？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#springmvc中的拦截器和servlet中的filter有什么区别" class="sidebar-link reco-side-springmvc中的拦截器和servlet中的filter有什么区别" data-v-cb1513f6>SpringMVC中的拦截器和Servlet中的filter有什么区别?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#讲一下-oom-以及遇到这种情况怎么处理的-是否使用过日志分析工具" class="sidebar-link reco-side-讲一下-oom-以及遇到这种情况怎么处理的-是否使用过日志分析工具" data-v-cb1513f6>讲一下 oom 以及遇到这种情况怎么处理的，是否使用过日志分析工具 ?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring-boot-中-约定优于配置-的具体产品体现在哪里。" class="sidebar-link reco-side-spring-boot-中-约定优于配置-的具体产品体现在哪里。" data-v-cb1513f6>Spring Boot 中 “约定优于配置“的具体产品体现在哪里。</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring-boot-中如何实现定时任务" class="sidebar-link reco-side-spring-boot-中如何实现定时任务" data-v-cb1513f6>Spring Boot 中如何实现定时任务 ?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#wait-和-sleep-的区别" class="sidebar-link reco-side-wait-和-sleep-的区别" data-v-cb1513f6>wait 和 sleep 的区别</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring-boot-starter-parent-有什么用" class="sidebar-link reco-side-spring-boot-starter-parent-有什么用" data-v-cb1513f6>spring-boot-starter-parent 有什么用 ?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring-boot-是否可以使用-xml-配置" class="sidebar-link reco-side-spring-boot-是否可以使用-xml-配置" data-v-cb1513f6>Spring Boot 是否可以使用 XML 配置 ?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#spring-boot-打成的-jar-和普通的-jar-有什么区别" class="sidebar-link reco-side-spring-boot-打成的-jar-和普通的-jar-有什么区别" data-v-cb1513f6>Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#nginx是如何实现高并发的" class="sidebar-link reco-side-nginx是如何实现高并发的" data-v-cb1513f6>Nginx是如何实现高并发的？</a></li><li class="level-2" data-v-cb1513f6><a href="/oliver-vuepress/articles/question/first.html#tomcat-servlet容器处理流程" class="sidebar-link reco-side-tomcat-servlet容器处理流程" data-v-cb1513f6>Tomcat Servlet容器处理流程</a></li></ul></main> <!----></div></div></div></div><div class="global-ui"><div class="back-to-ceiling" style="right:1rem;bottom:6rem;width:2.5rem;height:2.5rem;border-radius:.25rem;line-height:2.5rem;display:none;" data-v-c6073ba8 data-v-c6073ba8><svg t="1574745035067" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5404" class="icon" data-v-c6073ba8><path d="M526.60727968 10.90185116a27.675 27.675 0 0 0-29.21455937 0c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z" p-id="5405" data-v-c6073ba8></path><path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 30.59548842-82.51086798 68.34111062z" p-id="5406" data-v-c6073ba8></path></svg></div></div></div>
    <script src="/oliver-vuepress/assets/js/app.c21e6ffc.js" defer></script><script src="/oliver-vuepress/assets/js/3.6dd9a2a1.js" defer></script><script src="/oliver-vuepress/assets/js/1.898920d0.js" defer></script><script src="/oliver-vuepress/assets/js/66.4ee90e29.js" defer></script>
  </body>
</html>
